﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class Statystyki : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            String statId = Request.QueryString["statId"];
            String action = Request.QueryString["action"];
            String matchId = Request.QueryString["matchId"];
            String setNumber = Request.QueryString["set"];

            if ((matchId == null) && (setNumber == null))
            {
                statsPanel.Visible = false;
                infoLabel.Text = "Błąd! Podano zły URL.";
                return;
            }

            if (String.Equals(action, "new"))
            {
                submitBtn.Text = "Dodaj";
                infoLabel.Text = "Dodawanie nowej statystyki meczowej";
                homeLabel.Text = "Gospodarz";
                awayLabel.Text = "Gość";
            }
            else if ((String.Equals(action, "edit")) && (statId != null))
            {
                updateScores(setNumber, matchId);
                submitBtn.Text = "Zapisz zmiany";
                infoLabel.Text = "Edycja statystyki meczowej nr " + statId;
            }
            else
            {
                statsPanel.Visible = false;
                infoLabel.Text = "Błąd! Podano zły URL.";
            }
        }
    }

    private void updateScores(string set, string matchId)
    {
        SqlConnection sqlConn;
        SqlCommand sqlCmd;
        String strConnection;

        // Get connection string from webconfig
        strConnection = statsDataSource.ConnectionString;
        sqlConn = new SqlConnection(strConnection);
        sqlCmd = new SqlCommand("SELECT wynik_d1s" + set + ", wynik_d2s" + set + 
                                ", druzyna1, druzyna2 FROM mecze WHERE id_meczu = @id_meczu;", sqlConn);
        sqlCmd.Parameters.Add(new SqlParameter("@id_meczu", matchId));
        sqlConn.Open();
        SqlDataReader rdr = sqlCmd.ExecuteReader();
        if (rdr.HasRows)
        {
            rdr.Read();
            homeScore.Text = rdr.GetByte(0).ToString();
            awayScore.Text = rdr.GetByte(1).ToString();
            homeLabel.Text = rdr.GetString(2);
            awayLabel.Text = rdr.GetString(3);
        }
        sqlConn.Close();
    }

    protected void submitForm(object sender, EventArgs e)
    {
        String statId = Request.QueryString["statId"];
        String action = Request.QueryString["action"];
        String matchId = Request.QueryString["matchId"];
        String setNumber = Request.QueryString["set"];
        
        SqlConnection sqlConn;
        SqlCommand sqlCmd;
        String strConnection;

        // Get connection string from webconfig
        strConnection = statsDataSource.ConnectionString;
        sqlConn = new SqlConnection(strConnection);

        int wynik1 = 0, wynik2 = 0;

        try
        {
            wynik1 = int.Parse(homeScore.Text);
            wynik2 = int.Parse(awayScore.Text);
            if ((wynik1 < 0) || (wynik1 > 255))
                throw new Exception();
            if ((wynik2 < 0) || (wynik2 > 255))
                throw new Exception();
        }
        catch (Exception ex)
        {
            String liga = Request.QueryString["liga"];
            Response.Redirect("ListaStatystyk.aspx?liga=" + liga + "&color=red&msg=Błąd podczas odczytu wyników meczowych! Sprawdź czy dane są w zakresie 0-255. ");
        }

        // Preparing data
        double  d1_atak = 0.0,
                d1_blok = 0.0,
                d1_zagrywka = 0.0,
                d1_przyjecie = 0.0,
                d1_bledy = 0.0,
                d2_atak = 0.0,
                d2_blok = 0.0,
                d2_zagrywka = 0.0,
                d2_przyjecie = 0.0, 
                d2_bledy = 0.0;

        try
        {
            d1_atak = double.Parse(atak1_udane_input.Text) / double.Parse(atak1_wszystkie_input.Text);
            d1_blok = double.Parse(blok1_udane_input.Text) / double.Parse(blok1_wszystkie_input.Text);
            d1_zagrywka = double.Parse(zagrywka1_udane_input.Text) / double.Parse(zagrywka1_wszystkie_input.Text);
            d1_przyjecie = double.Parse(przyjecia1_udane_input.Text) / double.Parse(przyjecia1_wszystkie_input.Text);
            d1_bledy = double.Parse(akcje1_udane_input.Text) / double.Parse(akcje1_wszystkie_input.Text);
            d2_atak = double.Parse(atak2_udane_input.Text) / double.Parse(atak2_wszystkie_input.Text);
            d2_blok = double.Parse(blok2_udane_input.Text) / double.Parse(blok2_wszystkie_input.Text);
            d2_zagrywka = double.Parse(zagrywka2_udane_input.Text) / double.Parse(zagrywka2_wszystkie_input.Text);
            d2_przyjecie = double.Parse(przyjecia2_udane_input.Text) / double.Parse(przyjecia2_wszystkie_input.Text);
            d2_bledy = double.Parse(akcje2_udane_input.Text) / double.Parse(akcje2_wszystkie_input.Text);
        }
        catch (Exception ex)
        {
            String liga = Request.QueryString["liga"];
            Response.Redirect("ListaStatystyk.aspx?liga=" + liga + "&color=red&msg=Błąd podczas odczytu pól statystyk! Sprawdź czy wszystkie są prawidłowo uzupełnione. ");
        }

        // Adding new stat
        if ((String.Equals(action, "new")) && (statId == null) && (matchId != null))
        {
            infoLabel.Text = "Dodawanie nowej statystyki meczowej";

            sqlCmd = new SqlCommand("INSERT INTO [STATYSTYKI] ([id_meczu], [d1_atak], [d1_blok], [d1_zagrywka], [d1_przyjecie], [d1_bledy], [d2_atak], [d2_blok], [d2_zagrywka], [d2_przyjecie], [d2_bledy]) " +
                "VALUES (@id_meczu, @d1_atak, @d1_blok, @d1_zagrywka, @d1_przyjecie, @d1_bledy, @d2_atak, @d2_blok, @d2_zagrywka, @d2_przyjecie, @d2_bledy); SELECT CAST(scope_identity() AS int)", sqlConn);
        
            try
            {
                sqlCmd.Parameters.Add(new SqlParameter("@id_meczu", matchId));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_atak", d1_atak));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_blok", d1_blok));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_zagrywka", d1_zagrywka));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_przyjecie", d1_przyjecie));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_bledy", d1_bledy));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_atak", d2_atak));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_blok", d2_blok));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_zagrywka", d2_zagrywka));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_przyjecie", d2_przyjecie));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_bledy", d2_bledy));
                // Opens a connection
                sqlConn.Open();
                // Executes query
                Int32 id = (Int32) sqlCmd.ExecuteScalar();
                sqlConn.Close();

                // Adding info to matches table
                sqlCmd = new SqlCommand("UPDATE mecze SET stats_s" + setNumber + " = @stat_id, " + 
                    "wynik_d1s" + setNumber + " = @home_score, " +
                    "wynik_d2s" + setNumber + " = @away_score " + 
                    "WHERE id_meczu = @id_meczu;", sqlConn);
                sqlCmd.Parameters.Add(new SqlParameter("@id_meczu", matchId));
                sqlCmd.Parameters.Add(new SqlParameter("@stat_id", id));
                sqlCmd.Parameters.Add(new SqlParameter("@home_score", homeScore.Text));
                sqlCmd.Parameters.Add(new SqlParameter("@away_score", awayScore.Text));
                sqlConn.Open();
                sqlCmd.ExecuteNonQuery();
                sqlConn.Close();

                // At the end, update game's final result
                updateGameResult(matchId);

                String liga = Request.QueryString["liga"];
                Response.Redirect("ListaStatystyk.aspx?liga=" + liga + "&msg=Dodano statystykę dla meczu nr " + matchId);
            }
            catch (Exception ex)
            {

                infoLabel.Text = "Błąd! Wystąpił problem połączenia z bazą danych podczas dodawania nowej statystyki.";
            }
        }
        else if ((String.Equals(action, "edit")) && (statId != null))
        {
            try
            {
                sqlCmd = new SqlCommand("UPDATE [STATYSTYKI] SET [d1_atak] = @d1_atak, [d1_blok] = @d1_blok, [d1_zagrywka] = @d1_zagrywka,"
                    + " [d1_przyjecie] = @d1_przyjecie, [d1_bledy] = @d1_bledy, [d2_atak] = @d2_atak, [d2_blok] = @d2_blok, [d2_zagrywka] = @d2_zagrywka, [d2_przyjecie] = @d2_przyjecie, [d2_bledy] = @d2_bledy WHERE [id_statystyki] = @id_statystyki;", sqlConn);

                long id = long.Parse(Request.QueryString["statId"]);
                // We need it only while updating a row
                sqlCmd.Parameters.Add(new SqlParameter("@id_statystyki", id));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_atak", d1_atak));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_blok", d1_blok));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_zagrywka", d1_zagrywka));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_przyjecie", d1_przyjecie));
                sqlCmd.Parameters.Add(new SqlParameter("@d1_bledy", d1_bledy));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_atak", d2_atak));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_blok", d2_blok));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_zagrywka", d2_zagrywka));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_przyjecie", d2_przyjecie));
                sqlCmd.Parameters.Add(new SqlParameter("@d2_bledy", d2_bledy));
                // Opens a connection
                sqlConn.Open();
                // Executes query
                sqlCmd.ExecuteNonQuery();
                sqlConn.Close();


                // Adding info to matches table
                sqlCmd = new SqlCommand("UPDATE mecze SET wynik_d1s" + setNumber + " = @home_score, " +
                    "wynik_d2s" + setNumber + " = @away_score " +
                    "WHERE id_meczu = @id_meczu;", sqlConn);
                sqlCmd.Parameters.Add(new SqlParameter("@id_meczu", matchId));
                sqlCmd.Parameters.Add(new SqlParameter("@home_score", homeScore.Text));
                sqlCmd.Parameters.Add(new SqlParameter("@away_score", awayScore.Text));
                sqlConn.Open();
                sqlCmd.ExecuteNonQuery();
                sqlConn.Close();

                // At the end, update game's final result
                updateGameResult(matchId);

                String liga = Request.QueryString["liga"];
                Response.Redirect("ListaStatystyk.aspx?liga=" + liga + "&msg=Zmodyfikowano statystykę dla meczu nr " + matchId);
            }
            catch (Exception ex)
            {
                infoLabel.Text = "Błąd! Wystąpił problem połączenia z bazą danych podczas edycji statystyki.";
            }
        }
    }

    // Updates game's final result
    private void updateGameResult(String matchId)
    {
        SqlConnection sqlConn;
        SqlCommand sqlCmd;
        String strConnection;
        int homeSets = 0, guestSets = 0;

        // Get connection string from webconfig
        strConnection = statsDataSource.ConnectionString;
        sqlConn = new SqlConnection(strConnection);

        sqlCmd = new SqlCommand("SELECT wynik_d1s1, wynik_d2s1, wynik_d1s2, wynik_d2s2, wynik_d1s3, wynik_d2s3, wynik_d1s4, wynik_d2s4, wynik_d1s5, wynik_d2s5 FROM MECZE WHERE (id_meczu = @id_meczu)", sqlConn);
        sqlCmd.Parameters.Add(new SqlParameter("@id_meczu", matchId));
        sqlConn.Open();
        SqlDataReader rdr = sqlCmd.ExecuteReader();
        if (rdr.HasRows)
        {
            rdr.Read();
            for (int i = 0; i < 10; i += 2)
                try
                {
                        if (rdr.GetByte(i) > rdr.GetByte(i + 1))
                            homeSets++;
                        else
                            guestSets++;
                }
                catch (Exception ex)
                {
                    ;
                }
        }
        sqlConn.Close();
        // Now let's update match record
        sqlCmd = new SqlCommand("UPDATE MECZE SET wynik1 = @home_score, wynik2 = @guest_score WHERE (id_meczu = @id_meczu)", sqlConn);
        sqlCmd.Parameters.Add(new SqlParameter("@id_meczu", matchId));
        sqlCmd.Parameters.Add(new SqlParameter("@home_score", homeSets));
        sqlCmd.Parameters.Add(new SqlParameter("@guest_score", guestSets));
        sqlConn.Open();
        sqlCmd.ExecuteNonQuery();
        sqlConn.Close();
    }

    protected void backBtn_Click(object sender, EventArgs e)
    {
        String liga = Request.QueryString["liga"];
        Response.Redirect("ListaStatystyk.aspx?liga=" + liga);
    }
}
